home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
NEW
/
A-Newest
/
TORPET.d64
/
graphic tutor
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2009-10-12
|
16KB
|
392 lines
0 REM" PONZO*82*WATERLOO
1 [143]"
1000 GOSUB60000:PRINT"[147] [159]GRAPHICS-1[159]"
1001 PRINT"[176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"
1002 PRINT"[221] [159] GRAPHICS AND STUFF [146] [221]":MS$=" WELCOME! "
1003 PRINT"[173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]":GOSUB63100
1004 GOSUB63000
1005 PRINT"[147] THE VIDEO SCREEN"
1010 PRINT"LET'S FIND OUT HOW THE C64 DECIDES WHAT"
1020 PRINT"TO PUT IN ONE OF THE 1000 SCREEN"
1030 PRINT"LOCATIONS..SAY LOCATION #K."
1040 PRINT"(WHERE K=0 OR 1 OR 2 OR.. 999)"
1050 PRINT"1[146]:LOOK IN S[146]CREEN M[146]EMORY[146], IN LOCATION"
1060 PRINT" SM[146]+K, AND GET 1 BYTE:N (0<=N<=255)"
1070 PRINT"2[146][146]:LOOK IN C[146]HARACTER M[146]EMORY[146], IN"
1080 PRINT" LOCATIONS CM[146]+8*N,CM[146]+8*N+1,..CM[146]+8*N+7"
1090 PRINT" AND GET 8 BYTES:P,P+1,..,P+7."
1100 PRINT"3[146]:LOOK IN COLOUR MEMORY[146], IN LOCATION"
1110 PRINT" 55296+K, AND GET 1 NYBBLE:C (0<=C<=15)"
1120 GOSUB63000
1130 PRINT"[147]THEN, ARMED WITH 8 BYTES P,P+1,...,P+7"
1140 PRINT"AND 1 NYBBLE C (4 BITS), THE C64"
1150 PRINT"USES THE 64 BITS OF P,P+1,...,P+7"
1160 PRINT"TO DETERMINE WHICH 'DOTS' OR 'PIXELS'"
1170 PRINT"AT SCREEN LOCATION K ARE TO BE ON[146]"
1180 PRINT"AND WHICH ARE TURNED OFF[146]."
1190 PRINT"THE OFF[146] PIXELS ARE IN THE BACKGROUND[146]"
1200 PRINT"COLOUR, AND THE ON[146] PIXELS ARE IN"
1210 PRINT"THE COLOUR GIVEN BY THE NYBBLE C[146]!"
1220 GOSUB63000
1230 PRINT"[147]IF THE 8 BYTES P,P+1,...,P+7 TAKEN FROM"
1240 PRINT"CHARACTER MEMORY[146], WHICH STARTS AT CM[146],"
1250 PRINT"GIVE THE 'PIXEL PATTERN' FOR THE LETTER"
1260 PRINT"'P', AND THE NYBBLE TAKEN FROM COLOUR"
1270 PRINT"MEMORY[146], WHICH STARTS AT 55296, IS"
1280 PRINT"C='10' (LIGHT RED), A LIGHT RED 'P'"
1290 PRINT"WILL APPEAR ON THE SCREEN IN THE K'TH"
1300 PRINT"SCREEN POSITION.":MS$="1=ON[146] 0=OFF[146]":GOSUB63100:GOSUB63000
1310 PRINT"[147]'NORMALLY' SCREEN MEMORY[146] STARTS AT"
1320 PRINT"SM=1024[146]. THESE 1000 MEMORY LOCATIONS,"
1330 PRINT"FROM 1024 TO 2023, HOLD 'CHARACTER"
1340 PRINT"NUMBERS'. IF THE LOCATION 1039 HOLDS"
1350 PRINT"N=17 THEN, SINCE 1039=1024+15 IS THE"
1360 PRINT"15'TH SCREEN POSITION, THIS 15'TH"
1370 PRINT"POSITION WILL DISPLAY THE 17'TH"
1380 PRINT"CHARACTER IN CHARACTER MEMORY[146]!"
1390 PRINT"(NOTE: SCREEN POSITIONS ARE NUMBERED"
1400 PRINT" 0,1,...999 SO #15 IS"
1405 PRINT" REALLY THE 16'TH POSITION!)":GOSUB63000
1410 PRINT"[147]'NORMALLY' CHARACTER MEMORY[146] STARTS AT"
1420 PRINT"CM=53248 IF YOU'RE USING 'UPPER CASE"
1430 PRINT"AND GRAPHICS', AND STARTS AT"
1440 PRINT"CM=55296 IF YOU'RE USING 'LOWER AND"
1450 PRINT"UPPER CASE'."
1451 PRINT"NOTE[157][157][157][157][184][184][184][184][145]:FROM 53248 TO 55295 IS 2K BYTES"
1452 PRINT" :FROM 55296 TO 57343 IS 2K BYTES"
1453 PRINT" (2K FOR EACH 'CHARACTER SET')"
1455 MS$=" I CM ":GOSUB63100:GOSUB63000
1460 PRINT"[147]HOW DO YOU KNOW WHAT 'SM' IS?"
1470 PRINT"(WHERE SCREEN MEMORY[146] STARTS?)":
1475 MS$=" GUESS!":GOSUB63100:GOSUB63000
1480 PRINT"[147]LOOK IN V+24[146], THE 24'TH REGISTER"
1490 PRINT"IN THE VIDEO CHIP[146].":MS$="53248+24! ":GOSUB63100:GOSUB63000
1500 PRINT"[147]HOW DO YOU KNOW WHAT 'CM' IS?"
1510 PRINT"(WHERE CHARACTER MEMORY[146] STARTS?)":MS$="CM=???????":GOSUB63100
1520 GOSUB63000: PRINT"[147]LOOK IN V+24[146], THE 24'TH REGISTER"
1530 PRINT"IN THE VIDEO CHIP[146].":MS$="53248+24!!":GOSUB63100:GOSUB63000
1540 PRINT"[147]IN FACT THIS REGISTER, V+24[146],"
1550 PRINT"(V=53248[146] IS THE 'START' OF THE "
1560 PRINT"VIDEO CHIP) IS 8 BITS WIDE (1 BYTE)"
1570 PRINT"AND THE UPPER 4 BITS[146] (NYBBLE) GIVES"
1580 PRINT"THE START OF SCREEN MEMORY[146], SM,"
1590 PRINT"AND THE LOWER 4 BITS[146] GIVES THE"
1600 PRINT"START OF CHARACTER MEMORY[146], CM.":MS$="<SM>+<CM>":GOSUB63100
1610 GOSUB63000:PRINT"[147]SINCE 4 BITS CAN HAVE ONLY 16 VALUES"
1620 PRINT"THEN SCREEN MEMORY[146] CAN BE IN ONE OF"
1630 PRINT"16 POSSIBLE LOCATIONS, NAMELY:"
1640 PRINT"0,1024,2048,3072,4096,....,16384"
1650 PRINT"WHICH IS MORE EASILY THOUGHT OF AS"
1660 PRINT"1024 TIMES 0 OR 1 OR 2 ..OR 15."
1670 PRINT"SINCE SCREEN MEMORY[146] IS 'NORMALLY' AT"
1680 PRINT"1024 THEN THIS 'UPPER NYBBLE' CONTAINS"
1690 PRINT"'0001' IN BINARY OR '1' IN DECIMAL.":GOSUB63000
1700 PRINT"[147]SIMILARLY, CHARACTER MEMORY[146] CAN HAVE"
1710 PRINT"ONE OF 16 'STARTING ADDRESSES'..."
1720 PRINT"RIGHT?"
1725 MS$=" RIGHT[146]":GOSUB63100:GOSUB63000:PRINT"WRONG[146]!!!"
1730 PRINT"THE L[146]EAST S[146]IGNIFICANT B[146]IT IN V+24[146]"
1740 PRINT"ISN'T USED, SO THE 8[146] POSSIBLE"
1750 PRINT"LOWER NYBBLES IN V+24[146] ARE:"
1760 PRINT"000[214],001[214],010[214],011[214],100[214],101[214],110[214],111[214]"
1770 PRINT"EACH GIVING A DIFFERENT 'STARTING"
1780 PRINT"ADDRESS' FOR CHARACTER MEMORY[146],NAMELY:"
1790 PRINT"0,2048,4096,6144,....14336"
1800 PRINT"OR 2048*(0 OR 1 OR ... 7)":GOSUB63000
1810 PRINT"[147]'NORMALLY' CHARACTER MEMORY[146] IS AT"
1820 PRINT"CM=53248 (UPPER/GRAPHICS) OR"
1830 PRINT"CM=55296 (LOWER/UPPER) AND THE "
1840 PRINT"BIT PATTERNS 001[214] AND 011[214] WILL"
1850 PRINT"AUTOMATICALLY[146] SET CM=55396 OR CM=55296!"
1860 PRINT"ALSO YOU WON'T WANT TO USE 000[214] WHICH"
1870 PRINT"MEANS CM=0.(THE C64 NEEDS[146] THESE"
1880 PRINT"MEMORY LOCATIONS!)"
1890 PRINT"SO YOU CAN STORE 'PIXEL PATTERNS' AT:"
1900 PRINT"2048,8192,10240,12288 OR 14336":GOSUB63000
1910 PRINT"[147]IN FACT (!), EVEN SCREEN MEMORY[146] CAN"
1920 PRINT"NOT HAVE ALL 16 POSSIBLE 'STARTING"
1930 PRINT"POSITIONS'. THE BIT PATTERNS IN THE"
1940 PRINT"UPPER NYBBLE OF REGISTER V+24:"
1950 PRINT"0100,0101,0110,0111"
1960 PRINT"MEAN SCREEN MEMORY[146] AT:"
1970 PRINT"4096,5120,6144,7168"
1980 PRINT"AND THESE MEMORY LOCATIONS ARE NOT"
1990 PRINT"AVAILABLE FOR THE SCREEN!"
2000 PRINT"MORAL?":GOSUB63000
2010 PRINT"DO NOT USE 1024*(4 OR 5 OR 6)[146]!":GOSUB63000
2020 PRINT"[147]OK...SO YOU WANT TO 'DESIGN' YOUR"
2030 PRINT"OWN CHARACTER SET?"
2040 PRINT"JUST POINT THE VIDEO CHIP[146] TO"
2050 PRINT"YOUR[157][157][157][157][184][184][184][184][145] 'PIXEL PATTERNS'."
2060 PRINT"MAKE UP THE 'DOTS ON' AND 'DOTS OFF'"
2070 PRINT"WHICH DEFINE ALL 256 OR YOUR CHARACTERS"
2080 PRINT"& POKE THESE BITS (8-AT-ATIME=1 BYTE!)
2090 [153]"INTO CM,CM+1,...,CM+4095, CHOOSING"
2100 [153]"CMWAIT AS ONE OF THE AVAILABLE 'STARTING"
2110 [153]"ADDRESSES' FOR CHARACTER MEMORYWAIT"
2120 [153]"THEN TELL THE VIDEO CHIPWAIT BY"
2130 [153]"SETTING THE LOWER 4 BITS OF V+24WAIT.":[141]63000
2140 [153]"LOAD MULTI COLOUR MODE"
2150 [153]"SINCE COLOUR MEMORYWAIT HAS 1000 NYBBLES,"
2160 [153]"ONE FOR EACH OF THE 1000 SCREEN POS'NS,"
2170 [153]"THEN EACH CHARACTER ON THE SCREEN CAN"
2180 [153]"HAVE ONE OF 16 DIFFERENT COLOURS."
2190 [153]"(BUT ALL CHARACTERS SHARE THE SAME"
2200 [153]"'BACKGROUND COLOUR')."
2210 [153]"SUPPOSE YOU WANT MORE THAN 2WAIT COLOURS"
2220 [153]"WITHIN A SINGLE 'CURSOR POSITION'."
2230 [153]"THEN TELL THE VIDEO CHIPWAIT!":[141]63000
2240 [153]"LOADIN REGISTER V+22WAIT IS A MAGIC BIT,"
2250 [153]"BIT 4WAIT, WHICH TURNS ON MULTI-COLOURWAIT."
2260 [153]"DON'T DISTURB THE OTHER BITS IN V+22WAIT"
2270 [153]"SO POKE V+22,PEEK(V+22)OR16WAIT."
2280 [153]"IN THIS MODE LET'S SEE HOW THE C64"
2290 [153]"DETERMINES WHAT TO PUT IN ONE OF THE"
2300 [153]"1000 SCREEN POSITIONS, SAY #K."
2310 [153]"(REMEMBER: K=0,1,2,....,999)":MS$[178]"K=0 IS 1ST":[141]63100
2320 [141]63000:[153]"LOAD1WAIT:LOOK IN SCREEN MEMORYWAIT AND GET"
2330 [153]" THE K'TH BYTE, SAY IT'S N."
2340 [153]"2WAIT:LOOK IN CHARACTER MEMORYWAIT,"
2345 [153]" FROM CM+8*N TO CM+8*N+7"
2350 [153]" AND GET 8 BYTES: P,P+1,...,P+7."
2360 [153]"THE BITS IN P,P+1,...,P+7 DETERMINE"
2370 [153]"THE 'PIXEL ANDWAIT COLOUR PATTERN':"
2380 [153]"00WAIT SETS 2WAIT PIXELS TO COLOUR #0"
2390 [153]"01WAIT SETS 2WAIT PIXELS TO COLOUR #1"
2400 [153]"10WAIT SETS 2WAIT PIXELS TO COLOUR #2"
2410 [153]"11WAIT SETS 2WAIT PIXELS TO COLOUR #3":[141]63000:[153]"ONONON"
2420 [153]"?????????":[141]63000
2430 [153]"LOADLET'S SAY THAT AGAIN!"
2440 [153]"SUPPOSE THE FIRST BYTE,P,IS:"
2450 [153]"P=11 10 00 01 (IN BINARY)."
2460 [153]"THEN THE FIRST ROW OF PIXELS WILL BE:"
2470 [153]"CLR SYS WAIT _SEE, 4 COLOURS!"
2480 [153]"NOTE THAT 'PIXEL ON' OR 'PIXEL OFF'"
2490 [153]"IS NO LONGER MEANINGFUL."
2500 [153]"THERE ARE 4WAIT POSSIBILITIES FOR"
2510 [153]"EACH PAIRWAIT OF PIXELS!"
2520 [153]"NOTE,TOO,THAT THE HORIZONTAL RESOLUTION"
2530 [153]"IS NOT AS 'DETAILED' AS IN 'NORMAL'"
2540 [153]"COLOUR MODE (BIT4=0)."
2550 [141]63000:[153]"LOADSUPPOSE THE NUMBER NWAIT READ FROM"
2560 [153]"SCREEN MEMORYWAIT IS A 1WAIT."
2570 [153]"THEN THE 8 BYTES READ FROM CM+8-CM+15,"
2580 [153]"IN CHARACTER MEMORYWAIT, WILL HAVE THE"
2590 [153]"BIT PATTERN DEFINING THE LETTER 'A'."
2600 [153]"(IF 'NORMAL' CHAR. MEMORY:CM=53248)"
2610 [153]"NOTE:0='@',1='A',2='B', ETC.
2615 PRINT"THE SAME NUMBERS YOU 'POKE' TO"
2616 PRINT"SCREEN MEMORY[146] TO GET @,A,B.."
2617 PRINT"ON THE SCREEN!":GOSUB63000
2620 A$(0)="00011000 =P"
2630 A$(1)="00100100 =P+1"
2640 A$(2)="01000010 =P+2"
2650 A$(3)="01111110 =P+3"
2660 A$(4)="01000010 =P+4"
2670 A$(5)="01000010 =P+5"
2680 A$(6)="01000010 =P+6"
2690 A$(7)="00000000 =P+7"
2700 PRINT"[147]HERE ARE THE 8 BYTES FOR 'A':":FORI=0TO7:PRINTA$(I):NEXT
2710 PRINT"SEE THE LETTER 'A'?":GOSUB63000
2720 B$(0)=" [209][209] =P"
2730 B$(1)=" [209] [209] =P+1"
2740 B$(2)=" [209] [209] =P+2"
2750 B$(3)=" [209][209][209][209][209][209] =P+3"
2760 B$(4)=" [209] [209] =P+4"
2770 B$(5)=" [209] [209] =P+5"
2780 B$(6)=" [209] [209] =P+6"
2790 B$(7)=" =P+7"
2795 PRINT"";
2800 FORI=0TO7:PRINTB$(I):NEXT:MS$="NICE A,EH?":GOSUB63100:GOSUB63000
2810 PRINT"[147]";:FORI=0TO7:PRINTA$(I):NEXT
2815 PRINT"NOW, TAKEN IN PAIRS.."
2820 C$(0)="00[146]0110[146]00 =P"
2830 C$(1)="0010[146]0100[146] =P+1"
2840 C$(2)="01[146]0000[146]10 =P+2"
2850 C$(3)="0111[146]1110[146] =P+3"
2860 C$(4)="01[146]0000[146]10 =P+4"
2870 C$(5)="0100[146]0010[146] =P+5"
2880 C$(6)="01[146]0000[146]10 =P+6"
2890 C$(7)="0000[146]0000[146] =P+7"
2895 MS$="IN PEARS?":GOSUB63100
2900 GOSUB63000:PRINT"";:FORI=0TO7:PRINTC$(I):FORT=1TO500:NEXT:NEXT
2910 PRINT"DEPENDING UPON WHETHER THE 'BIT PAIRS'
2920 [153]"ARE 00WAIT OR 01WAIT OR 10WAIT OR 11WAIT"
2930 [153]"WE SET THE CORRESPONDING 'PIXEL PAIRS'"
2940 [153]"TO COLOUR #0 OR 1 OR 2 OR 3.":[141]63000
2950 [153]"";:
2960 D$(0)[178]" OPEN CLR WAIT =P"
2970 D$(1)[178]" CLR OPEN WAIT =P+1"
2980 D$(2)[178]"OPEN CLR WAIT =P+2"
2990 D$(3)[178]"OPEN CLR WAIT =P+3"
3000 D$(4)[178]"OPEN CLR WAIT =P+4"
3010 D$(5)[178]"OPEN CLR WAIT =P+5"
3020 D$(6)[178]"OPEN CLR WAIT =P+6"
3030 D$(7)[178]" WAIT =P+7"
3040 [129]I[178]0[164]7:[153]D$(I):[129]T[178]1[164]500:[130]:[130]:MS$[178]"LOOKS NICE":[141]63100
3050 [141]63000:[153]"LOAD";:[129]I[178]0[164]7:[153]D$(I):[130]
3060 [153]"....LOOK LIKE AN 'A'?"
3070 [153]"WELL, IT ISWAIT MADE UP OF 4WAIT COLOURS"
3080 [153]"AND THAT MAY BE WORTH THE LOSS IN"
3090 [153]"RESOLUTION."
3100 [153]"HOWEVER, YOU MAY WANT TO USE THIS"
3110 [153]"MULTI-COLOUR MODEWAIT FOR OTHER THAN TO"
3120 [153]"DISPLAY MULTI-COLOURED CHARACTERS!"
3130 [141]63000:[153]"LOADWHAT ARE THESE 'COLOUR #0' ETC,?""
3140 PRINT"IN V+33[146] V+34[146] & V+35[146] ARE THE"
3150 PRINT"COLOURS #0,#1 & #2."
3160 PRINT"THE LOWER NYBBLE IN THESE VIDEO CHIP"
3170 PRINT"REGISTERS DEFINE THE 16 POSSIBLE "
3180 PRINT"COLOURS FOR THE 00[146] 01[146] & 10[146] BIT PAIRS."
3190 PRINT"SINCE V=53248[146] THEN V+33[146]=53281"
3200 PRINT"WHICH YOU MAY RECOGNIZE AS THE REGISTER"
3210 PRINT"GIVING THE 'BACKGROUND' COLOUR!":PRINT"(COLOUR #0=BACKGROUND)"
3220 GOSUB63000:PRINT"[147]NOTICE THAT, HAVING PICKED YOUR"
3230 PRINT"FAVOURITE COLOURS #0,1 & 2, ALL[146]"
3240 PRINT"THE CHARACTERS ON THE SCREEN SHARE"
3250 PRINT"THESE COLOURS!"
3260 PRINT"BUT[157][157][157][184][184][184][145]..EACH CHARACTER CAN HAVE"
3270 PRINT"IT'S OWN 'COLOUR #3'!"
3280 PRINT"(BUT!THERE ARE ONLY 8 TO CHOOSE FROM!)."
3290 PRINT"WHERE'S COLOUR #3???":MS$="MY COLOUR!":GOSUB63100:GOSUB63000
3300 PRINT"[147]IN COLOUR MEMORY[146]!!":MS$="WHAT ELSE!":GOSUB63100
3305 GOSUB63000:PRINT"[147]LET'S SEE HOW THAT WORKS:"
3310 PRINT"RECALL THAT COLOUR MEMORY[146] IS MADE"
3320 PRINT"UP OF 1000 NYBBLES, AT 55296."
3330 PRINT"THERE IS A 'NYBBLE' FOR EACH SCREEN"
3340 PRINT"POSITION. YOU MIGHT EXPECT THAT THERE"
3350 PRINT"ARE 16[146] POSSIBLE COLOUR #3'S"
3370 PRINT"BUT[157][157][157][184][184][184][145] ONLY BITS 0-2 GIVE 'COLOUR #3'"
3380 PRINT"AND THE BIT 3[146] TELLS THE VIDEO CHIP"
3390 PRINT"WHETHER THE CORRESPONDING SCREEN"
3391 E$(1)="[176][192][178][192][178][192][178][192][174]"
3392 E$(2)="[221] [221] [221] [221] [221]"
3393 E$(3)="[173][192][177][192][177][192][177][192][189]"
3400 PRINT"POSITION IS MULTI-COLOUR OR NOT!!":GOSUB63000
3401 PRINT"[147]"E$(1)
3402 PRINTE$(2)" _ A NYBBLE IN COLOUR MEMORY"
3403 PRINTE$(3)
3404 PRINT" ^ ^ ^ ^"
3405 PRINT" [221] COLOUR"
3406 PRINT" [221] # 3 "
3407 PRINT" [221]"
3408 PRINT" MULTI-BIT[146]":MS$=" BIT 3[146]":GOSUB63100:GOSUB63000
3410 PRINT"[147]YOU MAY HAVE NOTICED SOMETHING STRANGE."
3411 PRINT"WE KEEP SAYING THAT CHARACTER MEMORY"
3412 PRINT"STARTS AT 55296"
3413 PRINT"WE ALSO SAY THAT COLOUR MEMORY"
3414 PRINT"STARTS AT 55296[146]!!"
3415 PRINT"WELL..IF YOU PEEK AND POKE 55296"
3416 PRINT"YOU'LL GET COLOUR MEMORY[146] ONLY."
3417 PRINT"THE 'NORMAL' CHARACTER MEMORY"
3418 PRINT"AT 55296 ISN'T SO SIMPLE TO ACCESS!"
3419 PRINT"..BUT THAT'S ANOTHER STORY..":GOSUB63000
3420 PRINT"[147]LET'S TRY MULTI-COLOUR!":MS$="OK OK OK":GOSUB63100:GOSUB63000
3425 PRINT"[147]ABCDEFGHIJKLMNPQRSTUVWXYZ":GOSUB63000
3440 PRINT"NOW INTO MULTI-COLOUR MODE[146] WITH:"
3450 PRINT"V=53248:POKEV+22,PEEK(V+22)OR16":GOSUB63001
3460 V=53248:POKEV+22,PEEK(V+22)OR16
3470 PRINT"NOTHING CHANGED, RIGHT?"
3480 PRINT"THAT'S BECAUSE COLOUR MEMORY HAS "
3490 PRINT"BIT 3 = 0[146]!":GOSUB63001:PRINT"LET'S:"
3500 PRINT"FORI=0TO25:POKE55296+I,8+8*RND(1):NEXT"
3510 PRINT"SETTING THE 1ST 26 NYBBLES IN COL. MEM."
3520 PRINT"TO RANDOM NUMBERS FROM 8 TO 15,":PRINT"THEN BIT 3 = 1":GOSUB63001
3530 FORI=0TO25:POKE55296+I,8+8*RND(1):NEXT:GOSUB63000
3540 PRINT"[147]A B C D E F G H I J K L M ":V=53248:POKEV+35,1:POKEV+34,0
3550 FORI=0TO25STEP2:POKE55296+I,8+8*RND(1):NEXT:POKE53281,12:PRINT""
3555 V=53248:POKEV+22,PEEK(V+22)OR16:GOSUB63000
3560 PRINT"LET'S PICK SOME COLOURS:"
3570 PRINT"FORI=0TO25:POKE55296+I,8+5:NEXT"
3580 PRINT"SET COLOUR #3 TO GREEN (GREEN=5)":GOSUB63001
3585 FORI=0TO25:POKE55296+I,13:NEXT
3590 PRINT"POKE V+35,0[146]..SET COLOUR #2 TO BLACK(0)":GOSUB63001:POKE53248+35,0
3600 PRINT"POKE V+34,1[146]..SET COLOUR #1 TO WHITE(1)":GOSUB63001:POKE53248+34,1
3610 PRINT"POKE V+33,2[146]..SET COLOUR #0 TO RED(2)":GOSUB63001:POKE53248+33,2
3620 GOSUB63000:PRINT"[147]":GOSUB60000:PRINT"[147] BIT MAP MODE"
3630 PRINT"IN REGISTER 17 OF THE VIDEO CHIP"
3640 PRINT"IS ANOTHER MAGIC BIT, BIT 5[146], WHICH"
3650 PRINT"PUTS THE C64 INTO BIT MAP MODE[146]."
3660 PRINT"POKE V+17,PEEK(V+17)OR32[146] DOES IT!":MS$=" V+17[146]":GOSUB63100
3665 GOSUB63000
3670 PRINT"[147]BIT WE WON'T..JUST YET..":GOSUB63000:PRINT"WELL..JUST ONCE:"
3680 GOSUB63000:V=53248:POKEV+17,PEEK(V+17)OR32:FORT=1TO1000:NEXT
3690 V=53248:POKEV+17,PEEK(V+17)AND223
3700 PRINT"[147]LET'S SEE HOW THAT[146] HAPPENS!"
3710 PRINT"TO DETERMINE WHAT GOES ON THE SCREEN"
3720 PRINT"AT SOME LOCATION 'K' (0<=K<=999)"
3730 PRINT"THE C64 DOES THE FOLLOWING:"
3740 PRINT"1[146]:GO DIRECTLY TO CHARACTER MEMORY"
3750 PRINT" TO LOCATIONS CM+8*K-CM+8*K+7"
3760 PRINT" AND GET 7 BYTES:P,P+1,...,P+7."
3770 PRINT"2[146]:GO TO SCREEN MEMORY[146], TO SM+K,"
3780 PRINT" AND GET 1 BYTE, SAY N.":GOSUB63000
3790 PRINT"[147]ARMED WITH P[146],P+1[146],..,P+7[146] AND N[146],"
3800 PRINT"SET THE PIXELS TO 'COLOUR C0' OR TO"
3810 PRINT"'COLOUR C1' DEPENDING UPON WHETHER THE"
3820 PRINT"CORRESPONDING BIT IN THE P,P+1,...,P+7"
3830 PRINT"PIXEL PATTERN IS '0' OR '1'":MS$="0=C0[146] 1=C1[146]":GOSUB63100
3840 GOSUB63000:PRINT"[147]COLOUR C0..COLOUR C1?????":GOSUB63001
3850 PRINT"WE LOOK AT THE BYTE,N,TAKEN FROM"
3860 PRINT"SCREEN MEMORY[146]:"
3870 FORI=1TO3:PRINTE$(I)E$(I):NEXT
3880 PRINT" ^ ^ ^ ^ ^ ^ ^ ^"
3890 PRINT" [221] [221] [221] [221] COLOUR C0"
3900 PRINT" [221] [221] [221] [221]"
3910 PRINT"COLOUR C1"
3920 GOSUB63001:PRINT"NICE??":GOSUB63000:MS$="VERY NICE!":GOSUB63100:PRINT"[147]"
3930 GOSUB63000:PRINT"NOTE[157][157][157][157][184][184][184][184][145]:CHARACTER MEMORY[146] STILL GIVES"
3940 PRINT" THE 'PIXEL PATTERN', BUT"
3950 PRINT" SCREEN MEMORY[146] GIVES THE COLOURS!!"
3960 PRINT"FURTHERMORE..THE 8K BYTES IN CM[146]-CM+8191"
3970 PRINT"(CHARACTER MEMORY)..ARE SIMPLY...":GOSUB63001
3980 PRINT"LAID ON TOP OF THE SCREEN[146]!!":GOSUB63001
3990 PRINT"JUST POKE V+17,PEEK(V+17)OR32"
4000 MS$=" V+17[146]":GOSUB63100:GOSUB63000:PRINT"[147]":GOSUB63000
4010 PRINT"NOW, TO GET SOMETHING INTERESTING"
4020 PRINT"ON THE SCREEN IN BIT MAP MODE[146], WE"
4030 PRINT"MUST PUT GOOD LOOKING 'PIXEL PATTERNS'"
4040 PRINT"INTO CHARACTER MEMORY[146]."
4050 PRINT"HOW?":GOSUB63001
4060 PRINT"POKE GOOD STUFF INTO, SAY, LOCATIONS"
4070 PRINT"8192 TO 8192+8191 (8K'S WORTH), THEN"
4080 PRINT"TELL THE VIDEO CHIP TO CHANGE THE"
4090 PRINT"'NORMAL' LOCATION OF CHARACTER MEMORY[146]"
4100 PRINT"SO IT STARTS AT 8192!"
4110 PRINT"HOW?":MS$="I GIVE UP":GOSUB63100:GOSUB63000
4120 PRINT"[147]POKE V+24,(PEEK(V+24)AND15)OR128)"
4130 PRINT"WHICH SETS THE UPPER NYBBLE IN THE"
4140 PRINT"24'TH REGISTER TO 1000[146], WHILE LEAVING"
4150 PRINT"ALL THE LOWER BITS UNCHANGED..."
4160 PRINT"AND 1000[146]=8 (IN DECIMAL)"
4170 PRINT"AND 8*1024=8192[146]"
4180 PRINT"SO CM[146]=START OF CHARACTER MEMORY[146] IS"
4190 PRINT"NOW AT 8192[146]!!":MS$=" SIMPLE":GOSUB63100:GOSUB63000
4300 PRINT"[147]":MS$="AU REVOIR!":GOSUB63100:PRINT"":END
60000 REM INITIALIZE
60001 BT$="":FORI=1TO24:BT$=BT$+"":NEXT
60002 PT$="[158][176][192][192][192][192][192][192][192][192][192][192][174][157][157][157][157][157][157][157][157][157][157][157][157][221][221][157][157][157][157][157][157][157][157][157][157][157][157][173][178][192][192][192][192][192][192][192][192][178][189]"
60003 PT$=PT$+"[157][157][157][157][157][157][157][157][157][157][157][157][157][206][163][163][163][163][163][163][163][163][163][163][163][163][205][157][157][157][157][157][157][157][157][157][157][157][157][157][157][165]============[167]"
60004 PT$=PT$+"[157][157][157][157][157][157][157][157][157][157][157][157][157][157][208][207][163][163][163][163][163][163][163][163][163][163][208][207][145][145][145][145][157][157][157][157][157][157][157][157][157][157][157][157]"
60005 PT$=BT$+"[145][145][145][145][145][145]"+PT$+"[159]"
60007 ML$=""
60008 WD=40:CRT=1024
60009 W2=WD/2:W3=WD-1:W1$=MID$(STR$(WD),2):POKE53281,6:POKE53280,6:PRINT""
60010 V=53248:FORI=0TO16:POKEV+I,0:NEXT
60011 POKEV+23,0:POKEV+29,0:FORI=0TO7:POKEV+39+I,0:NEXT
60020 RETURN
62000 GOSUB63000
62001 PRINTSD$CL$:PRINTCL$:PRINTCL$
62003 RETURN
63000 PRINT"HIT RETURN[146] TO CONTINUE";
63001 GETA$:IFA$<>""THEN63001
63002 GETA$:IFA$=""THEN63002
63003 RETURN
63100 FORT=1TO5:PRINTPT$MS$;
63101 PRINTPT$" ";
63102 PRINTPT$MS$;:NEXT
63103 PRINT"":RETURN
63900 SD$="":CL$="[146] [146]"
63901 SR$=""
63902 RETURN